package core{

import flash.display.DisplayObject;

import flash.display.Sprite;
import flash.events.Event;

import ru.cjay.loading.JSONLoader;
import ru.cjay.loading.ResourceLoader;


public class ALevel extends Sprite {

    private var _basicItemsItems:Array;
    private var _items:Array;
    private var config:Object;
    public var map_resources_link:String = null;

    protected var _is_dead:Boolean=false;

    private var _finishLoading:Boolean;
    public var rlist:Object = null;       //Resource list
    public var swf_list:Array = null;       //SWF-assets list


    public function ALevel() {
        _items = new Array();
        _basicItemsItems = new Array();
    }

    public function create():void
    {

    }
    public function destroy():void
    {
        for each(var item:AGameObject in _items)
        {
            removeChild(item);
            item.destroy();
        }
        /*
        for each(var second_item:DisplayObject in _basicItemsItems)
        {
            //TODO: Думал, что здесь нужно удалить все дисплей объекты, но и без этого вроде работает (а  с этим не работало ))) думаю, лишняя операция

        }        */
        _items.length=0;
        _basicItemsItems.length=0;

        _is_dead = true;

    }

    public function activate():void
    {
        addEventListener(Event.ENTER_FRAME, onUpdate);
        alpha = 1;
        Facade.getInstance().fadeOut();
    }
    public function deactivate():void
    {
        removeEventListener(Event.ENTER_FRAME, onUpdate);
        alpha = 0;
    }


    public function update():void
    {
        var object:AGameObject;
        for each(object in items)
        {
            object.update();
        }
    }

    // TODO: написать несколько функций для разных типов загружаемого контена



    public function loadResources(url:String):void
    {

        _finishLoading = false;
        if (url==null){
            onPreInit(null);
            return;
        }
        var loader:JSONLoader = new JSONLoader();
        loader.loadJSON(url,onPreInit);
    }

    private function onPreInit(obj:Object):void
    {
        config = obj;

        var rl:ResourceLoader =ResourceLoader.getInstance();
        if (config != null){
            map_resources_link = config.data.map_resources_link as String;
            rl.loadQueue(config.data.zones);        // parsing zones
        }

        rl.loadQueueFromObject(rlist);
        rl.loadSWFQueueFromObject(swf_list);
        if (rl.isEmpty())
        {
            onLoadResources(null)
        } else
        {
            rl.addEventListener(Event.COMPLETE, onLoadResources);
        }
    }

    protected function parse_config(object:Object):void
    {
    }

    private  function onLoadResources(event:Event):void
    {
        trace("OnLoadResource, config=",config);
        parse_config(config);
        _finishLoading = true;
        if (event)
        {
            event.target.removeEventListener(Event.COMPLETE, onLoadResources);
        }
    }

     private function onUpdate(event:Event):void{
         if (_finishLoading)
         {
            update();
         }

    }


    public function addGameObject(obj:AGameObject):void
    {
        _items.push(obj);
        addChild(obj);
    }
    public function addUpdatableObject(obj:AGameObject):void{
        _items.push(obj);
    }

    public function addBasicObject(obj:DisplayObject):void
    {
         _basicItemsItems.push(obj);
        addChild(obj);
    }

    public function get basicItems():Array
    {
        return _basicItemsItems;
    }
    public function get items():Array {
        return _items;
    }
}
}
